-- 此段代码负责初始化 `lspkind` 插件，这个插件用于在 Neovim 的补全菜单中显示图标和注释。通过传入配置对象来自定义显示的图标和文本，以及处理特定补全项的显示方式。最后，将格式化配置导出为模块，以便在主配置文件中使用。
-- 尝试加载 lspkind 模块
local lspkind = pRequire("lspkind")
if not lspkind then
  return
end

-- 初始化 lspkind 插件并配置显示注释和图标
lspkind.init({
  -- 定义如何显示注释，默认是只显示图标
  -- 可选项: 'text', 'text_symbol', 'symbol_text', 'symbol'
  mode = "symbol_text",
  -- 设置默认的图标集
  -- 可以是 'default' (需要 Nerd Fonts 字体) 或
  -- 'codicons' (需要 VSCode 的 codicons 字体)
  preset = "codicons",
  -- 覆盖预设的图标
  symbol_map = {
    -- 这里定义了一系列的图标映射
    Text = "",
    Method = "",
    Function = "",
    Constructor = "",
    Field = "ﰠ",
    Variable = "",
    Class = "ﴯ",
    Interface = "",
    Module = "",
    Property = "ﰠ",
    Unit = "塞",
    Value = "",
    Enum = "",
    Keyword = "",
    Snippet = "",
    Color = "",
    File = "",
    Reference = "",
    Folder = "",
    EnumMember = "",
    Constant = "",
    Struct = "פּ",
    Event = "",
    Operator = "",
    TypeParameter = "",
    Copilot = "",
  },
})

-- 创建一个用于导出配置的模块
local M = {}

-- 配置补全菜单的格式化
M.formatting = {
  format = lspkind.cmp_format({
    -- 使用带文本的图标模式
    mode = "symbol_text",
    -- 设置弹出窗口的最大宽度
    maxwidth = 50,
    -- 在 lspkind 修改前执行的函数
    before = function(entry, vim_item)
      -- 以下代码段用于处理 Tailwind CSS 颜色显示
      if vim_item.kind == "Color" and entry.completion_item.documentation then
        local _, _, r, g, b = string.find(entry.completion_item.documentation, "^rgb%((%d+), (%d+), (%d+)")
        if r then
          local color = string.format("%02x", r) .. string.format("%02x", g) .. string.format("%02x", b)
          local group = "Tw_" .. color
          if vim.fn.hlID(group) < 1 then
            vim.api.nvim_set_hl(0, group, {
              fg = "#" .. color,
            })
          end
          -- 使用黑色方块作为颜色图标
          vim_item.kind = "⬛"
          -- 设置高亮组
          vim_item.kind_hl_group = group
          return vim_item
        end
      end

      -- 设置补全项的右侧标签，显示补全来源
      vim_item.menu = ({
        copilot = "[AI]",
        buffer = "[Buffer]",
        nvim_lsp = "[LSP]",
        luasnip = "[Snip]",
        nvim_lua = "[Lua]",
        latex_symbols = "[LaTeX]",
      })[entry.source.name]
      return vim_item
    end,
  }),
}

-- 返回模块供外部使用
return M
